package com.linln.admin.pcs.api;


//import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
//import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
//import com.github.binarywang.wxpay.config.WxPayConfig;
//import com.github.binarywang.wxpay.exception.WxPayException;
//import com.github.binarywang.wxpay.service.WxPayService;
//import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.linln.admin.pcs.job.TimedTask;
import com.linln.admin.pcs.service.WeChatPayService;
import com.linln.admin.pcs.service.WechatPayRefundService;
import com.linln.common.data.QuerySpec;
import com.linln.common.utils.ResultVoUtil;
import com.linln.common.vo.ResultVo;
import com.linln.modules.system.domain.Company;
import com.linln.modules.system.domain.CompanyParam;
import com.linln.modules.system.domain.Order;
import com.linln.modules.system.domain.PayParam;
import com.linln.modules.system.repository.CompanyParamRepository;
import com.linln.modules.system.repository.CompanyRepository;
import com.linln.modules.system.repository.OrderRepository;
import com.linln.modules.system.util.WeChatPayUtil;
//import com.thoughtworks.xstream.XStream;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;


@RestController
@RequestMapping("/api/wechat/")
public class WxPayController {

    private final static Logger logger = LoggerFactory.getLogger(WxPayController.class);

    private final static String APPID = "wxf575fcff4fd8fddd";

    private final static String NOTIFY_URL = "https://www.weixin.qq.com/wxpay/pay.php";

    private final static String REFUND_NOTIFY_URL = "https://www.weixin.qq.com/wxpay/pay.php";

    @Autowired
    private WeChatPayService weChatPayService;

    @Autowired
    private WechatPayRefundService wechatPayRefundService;

    @Autowired
    private OrderRepository orderRepository;

    @Autowired
    private CompanyRepository companyRepository;

    @Autowired
    private CompanyParamRepository companyParamRepository;

    /**
     * 微信支付
     */
//    @PostMapping("pay/fee")
//    public ResultVo weixinH5Pay(@RequestBody PayParam payParam) throws Exception {
//        if (StringUtils.isNotEmpty(payParam.getOutTradeNo())&&StringUtils.isNotEmpty(payParam.getTotalFee())
//                &&StringUtils.isNotEmpty(payParam.getBody())&&StringUtils.isNotEmpty(payParam.getClientIp())){
//            //根据订单号查公司
//            QuerySpec querySpec = QuerySpec.matching();
//            querySpec.withMatcherValue("sn", QuerySpec.EQUAL, payParam.getOutTradeNo());
//            List<Order> orderList = orderRepository.findAll(QuerySpec.of(querySpec));
//            if (orderList.size()>0){
//                Order order = orderList.get(0);
//                QuerySpec querySpec1 = QuerySpec.matching();
//                querySpec1.withMatcherValue("companyId", QuerySpec.EQUAL, String.valueOf(order.getCompanyId()));
//                querySpec1.withMatcherValue("status", QuerySpec.EQUAL, "1");
//                List<CompanyParam> companyParamList = companyParamRepository.findAll(QuerySpec.of(querySpec1));
//                if (companyParamList.size()>0){
//                    CompanyParam companyParam = companyParamList.get(0);
//                    if (ObjectUtils.isNotEmpty(companyParam.getApiKey())&&ObjectUtils.isNotEmpty(companyParam.getKeyPath())
//                            &&ObjectUtils.isNotEmpty(companyParam.getMchId())){
//                        payParam.setApiKey(companyParam.getApiKey());
//                        payParam.setKeyPath(companyParam.getKeyPath());
//                        payParam.setMchId(companyParam.getMchId());
//                        payParam.setAppId(APPID);
//                        payParam.setNotifyUrl(NOTIFY_URL);
//                        // 创建订单并获取支付链接
//                        Map<String, String> result = weChatPayService.createOrder(payParam);
//                        if ("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code"))) {
//                            // 返回H5支付链接
//                            String payUrl = "redirect:" + result.get("mweb_url");
//                            order.setPayStatus((byte) 2);
//                            orderRepository.save(order);
//                            return ResultVoUtil.success(payUrl);
//                        } else {
//                            order.setPayStatus((byte) 3);
//                            order.setPayRemark(result.get("result_code")+",原因:"+result.get("err_code_des"));
//                            orderRepository.save(order);
//                            return ResultVoUtil.error(result.get("result_code")+",原因:"+result.get("err_code_des"));
//                        }
//                    }else{
//                        return ResultVoUtil.error("公司商户参数不能为空");
//                    }
//                }else{
//                    return ResultVoUtil.error("缺少公司商户参数");
//                }
//            }else{
//                return ResultVoUtil.error("订单不存在");
//            }
//        }else{
//            return ResultVoUtil.error("参数错误");
//        }
//    }
//
//    /**
//     * 处理退款请求
//     *
//     * @return 退款结果
//     */
//    @PostMapping("refund")
//    public ResultVo handleRefund(@RequestBody PayParam payParam) {
//        Map<String, String> msgMap = wechatPayRefundService.handleRefund(payParam);
//        String code = msgMap.get("code");
//        String msg = msgMap.get("msg");
//        if (code.equals("1")){
//            return ResultVoUtil.success(msg);
//        }else{
//            return ResultVoUtil.error(msg);
//        }
//
//    }
//
//    /**
//     * 微信支付回调
//     * @param request
//     * @return
//     * @throws Exception
//     */
//    @PostMapping("pay/notify")
//    public String handleNotify(HttpServletRequest request) throws Exception {
//        logger.error("微信支付回调");
//        Map<String, String> notifyData = WeChatPayUtil.parseXmls(request);
//        logger.error("微信支付回调参数："+notifyData);
//        if ("SUCCESS".equals(notifyData.get("return_code")) && "SUCCESS".equals(notifyData.get("result_code"))) {
//            // 处理业务逻辑（如更新订单状态）
//            System.out.println("收到支付成功通知，订单号：" + notifyData.get("out_trade_no"));
//            String out_trade_no = notifyData.get("out_trade_no");
//            QuerySpec querySpec = QuerySpec.matching();
//            querySpec.withMatcherValue("sn", QuerySpec.EQUAL, out_trade_no);
//            List<Order> orderList = orderRepository.findAll(QuerySpec.of(querySpec));
//            if (orderList.size()>0){
//                Order order = orderList.get(0);
//                //1 陪护 2 陪诊 3 陪检
//                int type = order.getType();
//                //判断是陪护还是陪诊陪检  如果是陪护则预缴费用
//                if (type==1){
//
//                }else{
//                    //扣除费用 回调里面
//                    order.setNum(1);
//                    order.setTotal(order.getPrice());
//                }
//                order.setBalance(order.getPrice());
//                //支付成功
//                order.setPayStatus((byte) 1);
//                orderRepository.save(order);
//            }
//            // 返回成功响应
//            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
//        } else {
//            if (null!=notifyData.get("out_trade_no")){
//                String out_trade_no = notifyData.get("out_trade_no");
//                QuerySpec querySpec = QuerySpec.matching();
//                querySpec.withMatcherValue("sn", QuerySpec.EQUAL, out_trade_no);
//                List<Order> orderList = orderRepository.findAll(QuerySpec.of(querySpec));
//                if (orderList.size()>0){
//                    Order order = orderList.get(0);
//                    order.setPayStatus((byte) 3);
//                    order.setPayRemark(notifyData.toString());
//                    orderRepository.save(order);
//                }
//            }
//            return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[处理失败]]></return_msg></xml>";
//        }
//    }
//
//    /**
//     * 退款回调接口
//     *
//     * @param request HttpServletRequest 对象
//     * @return 回调响应
//     */
//    @PostMapping("pay/refund_notify")
//    public String handleRefundNotify(HttpServletRequest request) {
//        logger.error("退款回调");
//        try {
//            // 初始化微信支付服务
//            WxPayService wxPayService = new WxPayServiceImpl();
//            PayParam payParam = new PayParam();
//            wxPayService.setConfig(initWxPayConfig(payParam));
//
//            // 获取回调数据
//            StringBuilder sb = new StringBuilder();
//            BufferedReader reader = request.getReader();
//            String line;
//            while ((line = reader.readLine()) != null) {
//                sb.append(line);
//            }
//            String notifyData = sb.toString();
//            logger.error("退款回调notifyData:"+notifyData);
//            // 将 XML 转换为 Map
//            XStream xstream = new XStream();
//            xstream.alias("xml", Map.class);
//            @SuppressWarnings("unchecked")
//            Map<String, String> data = (Map<String, String>) xstream.fromXML(notifyData);
//            logger.error("退款回调map:"+data);
////            // 解析并验证退款回调通知
////            WxPayRefundNotifyResult result = wxPayService.parseRefundNotifyResult(notifyData);
////
////            // 验证签名是否正确
////            if (!validateSignature(result.toMap(),payParam.getApiKey())) {
////                return "FAIL"; // 签名验证失败
////            }
////
////            // 处理退款回调逻辑
////            processRefundNotify(result);
//
//            // 返回成功响应给微信服务器
//            return "SUCCESS";
//        } catch (IOException e) {
//            e.printStackTrace();
//            return "FAIL"; // 处理异常情况
//        }
//    }
//    /**
//     * 初始化微信支付配置
//     *
//     * @return WxPayConfig 对象
//     */
//    private WxPayConfig initWxPayConfig(PayParam payParam) {
//        WxPayConfig payConfig = new WxPayConfig();
//        payConfig.setAppId(payParam.getAppId());
//        payConfig.setMchId(payParam.getMchId());
//        payConfig.setMchKey(payParam.getApiKey());
//        payConfig.setKeyPath(payParam.getKeyPath());
//        return payConfig;
//    }
//    /**
//     * 处理退款回调逻辑
//     *
//     * @param result 退款回调结果
//     */
//    private void processRefundNotify(WxPayRefundNotifyResult result) {
//
//        // 获取退款相关参数
////        String outTradeNo = result.getOutTradeNo(); // 商户订单号
////        String outRefundNo = result.getOutRefundNo(); // 商户退款单号
////        String refundId = result.getRefundId(); // 微信退款单号
////        Integer refundFee = result.getRefundFee(); // 退款金额（单位：分）
////
////        // 示例：更新数据库中的退款状态
////        System.out.println("收到退款通知：" + outTradeNo + "，退款金额：" + refundFee);
//
//        // TODO: 根据实际业务逻辑更新订单状态或记录退款信息
//    }
//
//
//
//    public boolean validateSignature(Map<String, String> data, String key) {
//        // 去除 sign 字段
//        Map<String, String> sortedParams = new TreeMap<>(data);
//        sortedParams.remove("sign");
//
//        // 拼接参数字符串
//        StringBuilder sb = new StringBuilder();
//        for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
//            if (entry.getValue() != null && !entry.getValue().isEmpty()) {
//                sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
//            }
//        }
//        sb.append("key=").append(key); // 添加商户密钥
//
//        // 生成签名
//        String calculatedSign = md5(sb.toString()).toUpperCase();
//
//        // 对比签名
//        String receivedSign = data.get("sign");
//        return calculatedSign.equals(receivedSign);
//    }
//
//    private String md5(String str) {
//        try {
//            MessageDigest md = MessageDigest.getInstance("MD5");
//            byte[] digest = md.digest(str.getBytes("UTF-8"));
//            return bytesToHex(digest);
//        } catch (Exception e) {
//            throw new RuntimeException("MD5加密失败", e);
//        }
//    }
//
//    private String bytesToHex(byte[] bytes) {
//        StringBuilder sb = new StringBuilder();
//        for (byte b : bytes) {
//            sb.append(String.format("%02x", b));
//        }
//        return sb.toString();
//    }
}
